Eerst een aantal libraries om de data op te halen en te verwerken.
In [23]:
import psycopg2
from configparser import ConfigParser
from pandas import DataFrame
from collections import Counter
We moeten verbinding maken met de databank.
In [16]:
cfg = ConfigParser()
cfg.read("db.cfg")
knst = psycopg2.connect(host=cfg['db']['host'], port=cfg['db']['port'],
database=cfg['db']['db'], user=cfg['db']['user'],
password=cfg['db']['pwd'])
knst.set_client_encoding('UTF-8')
cur = knst.cursor()
De SQL om de gegevens op te halen is niet zo moeilijk:
In [19]:
sql = """
SELECT pr.id, f.name_nl, pe.full_name
FROM production.productions pr
JOIN production.seasons s
ON pr.season_id = s.id
JOIN production.relationships r
ON pr.id = r.production_id
JOIN production.people pe
ON r.person_id = pe.id
JOIN production.functions f
ON r.function_id = f.id
WHERE s.start_year >= 2010
"""
Even de gegevens binnenhalen en in een pandas dataframe stoppen.
In [22]:
cur.execute(sql)
os = cur.fetchall()
df = DataFrame([o for o in os], columns=["productie_id", "functie", "persoon"])
Een kleine functie om de functies van een persoon op te halen en het totaal.
In [30]:
def get_counted_functions_for_person(persoon):
functies = Counter(df[df["persoon"] == persoon]["functie"]).most_common()
totaal_aantal_functies = sum([f[1] for f in functies])
functies_percentage = [(f[0], f[1] / float(totaal_aantal_functies)) for f in functies]
return functies_percentage, totaal_aantal_functies
Loopen doorheen alle personen.
In [38]:
lines = []
for persoon in set(df["persoon"].values):
functies, totaal = get_counted_functions_for_person(persoon)
for f in functies:
lijn = [persoon, totaal, f[0], f[1]]
lines.append(lijn)
df_functies = DataFrame(lines, columns=["persoon", "totaal aantal functies", "functie", "percentage"])
Het resultaat ziet er als volgt uit:
In [39]:
df_functies.head()
Out[39]:
Als voorbeeld even de persoon met het meeste aantal functies.
In [40]:
df_functies[df_functies["totaal aantal functies"] == max(df_functies["totaal aantal functies"])]
Out[40]:
Zelf verder analyseren? Download de excel file:
In [41]:
df_functies.to_excel("functies.xlsx")